/**
 * Contrôleur principal de l'Application.
 * Lance la vue de paramétrage de la la simulation
 */

package controleur;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import metier.Carte;
import metier.Environnement;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Parser;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.ParserFactory;
import utiles.CarteXMLHandler;
import utiles.FileNameCarteFilter;
import utiles.FourmizLogger;
import utiles.K;
import vue.VueParametrageSimulation;

/**
 *
 * @author S219
 */
public class ControllerParametrageSimulation  extends ControllerUtile{
    
    protected VueParametrageSimulation vue;
    
    public ControllerParametrageSimulation(Environnement e)
    {
        super();
        FourmizLogger.debug(this, "Lancement de Fourmiz...");
        
        this.initFourmizFileSystem(); // Initialise le dossier ~/Fourmiz ainsi que les sous dossiers associés
        
        this.vue = new VueParametrageSimulation(this, e);
        this.vue.setVisible(true);
    }
    
    public ControllerParametrageSimulation()
    {
        this(new Environnement());
    }
    
    /**
     * Retourne une liste de cartes sauvegardées par l'utilisateur
     * @return ArrayList<Carte> les cartes
     */
    public ArrayList<Carte> getSavedCartes()
    {
        ArrayList<Carte> savedCartes = new ArrayList();
        
        try {
            //Ajout de la carte de test 
//            this.addCarteFromPath("./src/utiles/carte.xml", savedCartes);
            
            // Ajout des cartes présentes dans ~/Fourmiz/Cartes
            File map_folder = new File(K.MAPS_FOLDER);        
            FileNameCarteFilter textFilter = new FileNameCarteFilter();
            File[] files = map_folder.listFiles(textFilter);
            
            //Pour chaque fichier XML
            for (File file : files) {                
                Carte c = this.getCarteFromPath(file.getAbsolutePath());// On lit le contenu
                if(c != null) //La carte est bien parsée
                {
                    savedCartes.add(c);
                }
            }
        
        } catch (Exception e) {
            FourmizLogger.error(this, e);
        }
        
        return savedCartes;
    }
    
    /**
     * Retourne une instance d'une Carte à partir du chemin de son fichier XML
     * @param path le chemin de la carte au format XML
     * @return l'instance une instance de carte, null en cas d'échec
     */
    protected Carte getCarteFromPath(String path)
    {
        Carte c = null;
        String xml = this.getXMLFromPath(path);
        if(xml != null)
        {
           c = this.getCarteFromXML(xml);
           if(c != null)
           {
                c.setPath(path);
           }
        }
        
        return c;
    }
    
    /**
     * Retourne le contenu XML d'un fichier à partir de son chemin
     * @param path le chemin du fichier XML
     * @return le contenu XML
     */
    protected String getXMLFromPath(String path)
    {
        String donnes_xml = null;
        
        try {
            BufferedReader br = new BufferedReader(new FileReader(new File(path)));
            String line;
            StringBuilder sb = new StringBuilder();

            while ((line = br.readLine()) != null) {
                sb.append(line.trim());
            }
            br.close();
            donnes_xml = sb.toString();
        } catch (IOException e) {
            FourmizLogger.error(this, e);
        }
        
        return donnes_xml;
    }
    
    /**
     * Retourne une instance d'une Carte à partir d'un contenu XML
     * @param xml le contenu XML
     * @return l'instance de la carte, null en cas d'échec de parsing
     */
    protected Carte getCarteFromXML(String xml)
    {
        CarteXMLHandler handler = new CarteXMLHandler();
        
        try {            
            Parser parser = ParserFactory.makeParser(K.CLASSE_PARSER);

            parser.setDocumentHandler(handler);
            parser.setErrorHandler((ErrorHandler) handler);

            parser.parse(new InputSource(new StringReader(xml)));

        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException | ClassCastException | SAXException | IOException e) {
            FourmizLogger.error(this, e);
        }
        
        return handler.getCarte();
    }
}
